using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;

namespace Ent.Inscripcion.Core.Administracion
{
    [Serializable]
    public class Requisito : BusinessBase<Requisito>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Id");
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<string> TipoProperty = RegisterProperty<string>(o => o.Tipo, "Name");
        public string Tipo
        {
            get { return GetProperty(TipoProperty); }
            set { SetProperty(TipoProperty, value); }
        }

        private static PropertyInfo<string> NombreProperty = RegisterProperty<string>(o => o.Nombre, "Name");
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
            set { SetProperty(NombreProperty, value); }
        }

        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Factory Methods

        public static Requisito NewRequisito()
        {
            return DataPortal.Create<Requisito>();
        }

        public static Requisito GetRequisito(Guid id)
        {
            return DataPortal.Fetch<Requisito>(id);
        }

        public static void DeleteRequisito(Guid id)
        {
            DataPortal.Delete<Requisito>(id);
        }

        private Requisito()
        { LoadProperty(IdProperty, Guid.NewGuid()); }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", criteria)};
            var datos = accesoDatos.EjecutarReader("ConsultarRequisito", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(TipoProperty, datos.Datos.GetString(1));
                LoadProperty(NombreProperty, datos.Datos.GetString(2));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            parametros.Add(new Parametro("Tipo", ReadProperty(TipoProperty)));
            parametros.Add(new Parametro("Nombre", ReadProperty(NombreProperty)));
            parametros.Add(new Parametro("Id", ReadProperty(IdProperty)));
            accesoDatos.EjecutarQuery("InsertarRequisito", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            parametros.Add(new Parametro("Tipo", ReadProperty(TipoProperty)));
            parametros.Add(new Parametro("Nombre", ReadProperty(NombreProperty)));
            parametros.Add(new Parametro("Id", ReadProperty(IdProperty)));
            accesoDatos.EjecutarQuery("ActualizarRequisito", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(ReadProperty(IdProperty));
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            parametros.Add(new Parametro("Id", ReadProperty(IdProperty)));
            accesoDatos.EjecutarQuery("EliminarRequisito", parametros);
        }

        #endregion
    }
}
